package club.babyf.nativeai.demo.algorithm;

import java.util.HashMap;
import java.util.Map;

/**
 * Test.
 *
 * @author zhanglei.
 * @date 2025/4/13 20:17.
 * @description 算法测试类.
 * 1、生成括号
 * 2、还原ip
 * 3、两数相加
 * 4、最长回文子串
 * 5、反转链表
 * 6、反转n个元素之后的链表
 * 7、删除链表中倒数第n个元素
 * 8、调整数组，奇数在前，偶数在后
 * 9、快速排序
 * 10、冒泡排序
 * 11、给你一个整数数组 nums 和一个整数 k ，请你统计并返回 该数组中和为 k 的子数组的个数，子数组是数组中元素的连续非空序列
 * 12、反转二叉树
 * 13、假设我们拥有数量足够多的不同整数面值的硬币，面值之间相互均不可整除，需要利用这些硬币组成指定的金额，要求使用的硬币总数尽可能少。输入参数：coins，为一个整数数组，代表各自的硬币面值；amount，整数，需要组成的金额。输出：所需的硬币数量，若无解则返回-1
 * 14、有一个int数组，里面的元素符合下面的特征，最多有一个元素出现一次，其余元素均出现两次，输入一个这样的数组，请写一个完整的函数找出是否有出现一次的元素？如有，这个元素是什么？举例： int[] = {1, 2, 5, 2, 1}，返回5 int[] = {-1, 2, -1, 2}，返回找不到
 * 15、计算两个有序数组的交集
 * 16、实现一个方法，从1开始按顺序输出连续的数字，输入参数是一个数字，输入时不保证顺序，收到连续的数字时，就输出结果。如果不连续，则不输出。比如，输入2，5，9，3，此时不输出结果。再输入1，此时输出1，2，3。再输入4，此时输出4，5。再输入6，输出6.……
 * 17、判断链表是否有环
 * 18、二分查找法
 * 19、最长不重复子序列
 * 20、两数相除
 * 21、在一个链表中，每k个元素链表进行翻转
 * 22、实现LRU缓存
 * 23、有序数组的两数之和
 * 24、无序数组的两数之和
 * 25、两个链表相加
 * 26、寻找两个正序数组的中位数
 * 27、接雨水
 * 28、合并K个正序链表为一个正序链表
 * 29、反转链表指定范围的链表
 * 30、LFU缓存
 * 31、字符串Z型转换
 * 32、整数翻转
 * 33、二叉树的层序遍历
 * 34、直播间在线人数统计
 * 35、连续数组
 */
public class Test {

    public int finMaxLength(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }

        Map<Integer, Integer> map = new HashMap<>();
        map.put(0, -1);
        int preSum = 0;
        int maxLength = 0;

        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == 0) {
                preSum -= 1;
            } else {
                preSum += 1;
            }

            if (map.containsKey(preSum)) {
                maxLength = Math.max(maxLength, i - map.get(preSum));
            } else {
                map.put(preSum, i);
            }
        }

        return maxLength;
    }

    public static void main(String[] args) {
        Test test = new Test();
    }

}
